# This code is used to take the trained classifiers and make predictions on the full set of EU legislation

library(pacman)


# This loads and installs the packages you need at once
pacman::p_load(tm,SnowballC,foreign,plyr,twitteR,slam,foreign,wordcloud,LiblineaR,e1071, topicmodels,readr,
              caret,dplyr,xgboost,quanteda)

############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
##################################    Predict on EU legislation ############################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################
############################################################################################################


# Load the regulation data
directive_provisions_regs = "/Users/jason/Desktop/Provisions/regulation-articles.csv"
newprovisiondata_regs<-read.csv(directive_provisions_regs)

# Load the directive data

directive_provisions_dirs = "/Users/jason/Desktop/Provisions/directive-articles.csv"
newprovisiondata_dirs<-read.csv(directive_provisions_dirs)

#[1] "celex"    "fileyear" "day"      "month"    "year"     "article" 

newprovisiondata_dirs<-newprovisiondata_dirs[,1:6]
# Restrict from 1960 onward
newprovisiondata_dirs<-newprovisiondata_dirs[as.numeric(as.character(newprovisiondata_dirs$fileyear))>1960,]
newprovisiondata_dirs[,2]<-as.numeric(as.character(newprovisiondata_dirs[,2]))
newprovisiondata_dirs[,3]<-as.numeric(as.character(newprovisiondata_dirs[,3]))
newprovisiondata_dirs[,4]<-as.numeric(as.character(newprovisiondata_dirs[,4]))
newprovisiondata_dirs[,5]<-as.numeric(as.character(newprovisiondata_dirs[,5]))

# Combine these into one mega data frame

newprovisiondata<-bind_rows(newprovisiondata_regs,newprovisiondata_dirs)

# Save the year, month and celex, but get rid of the text
newprovision.year = newprovisiondata$fileyear
newprovision.celex = newprovisiondata$celex
newprovisiondata.month = newprovisiondata$month

rawtext = newprovisiondata$article

## Process the text data
# Preprocess the text 

# Now we have to put the training data and classification data into one matrix

provisiontext.predict<-sapply(rawtext,as.character)

cleancorpus.predict<-corpus(provisiontext.predict)

token.dirty  = tokens(cleancorpus.predict,ngrams = 1:2)
token.clean = tokens_select(token.dirty, 
                            c("/","@", "\\|","#","http","https" ,".com","$", " g "),
                            selection ="remove")


dtm.predict <- dfm(token.clean, remove = stopwords("english"), 
                   remove_punct = TRUE,stem = TRUE)

dtm.predict <-  dfm_trim(dtm.new,sparsity=.9999)

# Remove the big files for memory concerns
rm(newprovisiondata_regs,newprovisiondata_dirs,rawtext,provisiontext.predict,cleancorpus.predict,newprovisiondata)

dtm_all_mat<-as.matrix(dtm.predict)

##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
################################Constraint Classifiers ######################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################

final.delegation.data = data.frame(newprovision.celex,newprovisiondata.month,newprovision.year)

science = list.files("/Users/jason/Dropbox/Research/Papers/Delegation-ML-Project/Trained-Classifiers/APSR_RnR/COM-Classifiers")
science = science[3:11]

for(i in 1:length(science)){
  science[i] = paste("/Users/jason/Dropbox/Research/Papers/Delegation-ML-Project/Trained-Classifiers/APSR_RnR/COM-Classifiers/",
                     science[i],sep = "")
}

colnames.classifiers = c()

# Generate predictions for each of the constraint classifiers, save the predictions in one large file
for(i in 1:8){
  load(science[i])
  print(science[i])

  # First step is to match the columns to subset
  colnames<-colnames(trainX)
  fullnames<-dtm.predict$dimnames$Terms
  indexno<-c()

  for(j in 1:length(colnames)){
    tempname = colnames[j]
    indexnum = which(tempname == fullnames)
    indexno = c(indexno, indexnum)
  }


  dtm_mat_class<-dtm_all_mat[,indexno]

  # Make predictions
  constraint.probs <- as.vector(predict(xgb1,dtm_mat_class))
  constraint.predictions <- ifelse(constraint.probs > 0.5,1,0)
  
  final.delegation.data = data.frame(final.delegation.data, constraint.probs,constraint.predictions)
  colnames.classifiers = c(colnames.classifiers,
                           paste(constrainttype,".probs", sep = ""), 
                          paste(constrainttype,".preds", sep =""))
}

names(final.delegation.data)[4:dim(final.delegation.data)[2]]<-colnames.classifiers

##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
################################ Delegation Classifier  ##################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################
##########################################################################################################################

load("/Users/jason/Dropbox/Research/Papers/Delegation-ML-Project/Trained-Classifiers/APSR_RnR/COM-Classifiers/delegation-com-classifier.RData")

# First step is to match the columns to subset
colnames<-colnames(trainX)
fullnames<-dtm.predict$dimnames$Terms
indexno<-c()

for(j in 1:length(colnames)){
  tempname = colnames[j]
  indexnum = which(tempname == fullnames)
  indexno = c(indexno, indexnum)
}


dtm_mat_class<-dtm_all_mat[,indexno]

# Make predictions
delegation.probs <- as.vector(predict(xgb1,dtm_mat_class))
delegation.predictions <- ifelse(delegation.probs > 0.5,1,0)


final.delegation.data = data.frame(final.delegation.data, delegation.probs,delegation.predictions)


write.csv(final.delegation.data,
          "/Users/jason/Dropbox/Research/Papers/Delegation-ML-Project/FINAL-OUTPUT-DATA/APSR_RnR/final_delegation_data_rnr_com.csv")












